﻿using System.Collections.Generic;
using System.Linq;
using Szabalyrendszer.Modositok;

namespace Szabalyrendszer
{
    public class KarakterLap : ITulajdonsagok, IHarcertek
    {
        public KarakterLap()
        {
            FegyverforgatoKar = new Fegyverzet();
            Vertezet = new Fegyverzet();
            NemFegyverforgatoKar = new Fegyverzet();
            Modositok = new List<Bonusz>();

            alapEro = new Tulajdonsag();
            alapGyorsasag = new Tulajdonsag();
            alapUgyesseg = new Tulajdonsag();
            alapAllokepesseg = new Tulajdonsag();
            alapEgeszseg = new Tulajdonsag();
            alapKarizma = new Tulajdonsag();
            alapIntelligencia = new Tulajdonsag();
            alapAkaratero = new Tulajdonsag();
            alapAsztral = new Tulajdonsag();
            alapErzekeles = new Tulajdonsag();
        }

        public string Nev { get; set; }
        public int Szint { get; set; }
        public bool KiszamoltKarakter { get; set; }

        private Tulajdonsag alapEro;
        private Tulajdonsag alapGyorsasag;
        private Tulajdonsag alapUgyesseg;
        private Tulajdonsag alapAllokepesseg;
        private Tulajdonsag alapEgeszseg;
        private Tulajdonsag alapKarizma;
        private Tulajdonsag alapIntelligencia;
        private Tulajdonsag alapAkaratero;
        private Tulajdonsag alapAsztral;
        private Tulajdonsag alapErzekeles;

        private int ep;
        public int AlapFp { get { return Allokepesseg + Akaratero; } }
        public int AlapKe { get { return Gyorsasag + Erzekeles; } }
        public int AlapTe { get { return Ero + Gyorsasag + Ugyesseg; } }
        public int AlapVe { get { return Gyorsasag + Ugyesseg + 60; } }
        public int AlapCe { get { return Ugyesseg + Erzekeles; } }
        public int AlapSfe { get { return 0; } }
        public int AlapMgt { get { return 0; } }
        public int AlapTulutesKuszob { get { return 50; } }
        public PotencialisSebzes AlapSebzes { get { return new PotencialisSebzes(); } }

        //public int Atutes
        //{
        //    get { return AlapAtutes + Modositok.OfType<IHarcertek>().Sum(m => m.Atutes); }
        //    set { }
        //}

        public int TulutesKuszob
        {
            get { return AlapTulutesKuszob + Modositok.OfType<IHarcertek>().Sum(m => m.TulutesKuszob); }
            set { }
        }

        public int Ep
        {
            get { return KiszamoltKarakter ? ep : Egeszseg.Ertek + Modositok.OfType<EleteroBonusz>().Sum(m => m.Ep); }
            set { ep = value; }
        }
        public int Fp
        {
            get { return AlapFp + Modositok.OfType<EleteroBonusz>().Sum(m => m.Fp); }
            set { }
        }
        
        public int Ke
        {
            get { return AlapKe + FegyverforgatoKar.Ke + Modositok.OfType<IHarcertek>().Sum(m => m.Ke); }
            set { }
        }

        public int Te
        {
            get { return AlapTe + FegyverforgatoKar.Te + Modositok.OfType<IHarcertek>().Sum(m => m.Te); }
            set { }
        }
        //Nem fegyverforgato kar te
        public int Ve
        {
            get { return AlapVe + FegyverforgatoKar.Ve + NemFegyverforgatoKar.Ve + Modositok.OfType<IHarcertek>().Sum(m => m.Ve); }
            set { }
        }

        public int Ce
        {
            get { return AlapCe + FegyverforgatoKar.Ce + Modositok.OfType<IHarcertek>().Sum(m => m.Ce); }
            set { }
        }

        public int Sfe
        {
            get { return AlapSfe + Vertezet.Sfe + Modositok.OfType<IHarcertek>().Sum(m => m.Sfe); }
            set { }
        }

        public int Mgt
        {
            get { return AlapMgt + Vertezet.Mgt + Modositok.OfType<IHarcertek>().Sum(m => m.Mgt); }
            set { }
        }
        public PotencialisSebzes Sebzes
        {
            get
            {
                var modositoOszeg = new PotencialisSebzes();
                modositoOszeg = Modositok.OfType<IHarcertek>().Aggregate(modositoOszeg, (current, modosito) => current + modosito.Sebzes);
                return AlapSebzes + modositoOszeg;
            }
            set { }
        }
        public int Idoigeny { get; set; }

        public Fegyverzet FegyverforgatoKar { get; set; }
        public Fegyverzet Vertezet { get; set; }
        public Fegyverzet NemFegyverforgatoKar { get; set; }
        public List<Bonusz> Modositok { get; set; }
        public List<Kepzettseg> Kepzettsegek { get; set; }

        public Tulajdonsag Ero
        {
            get { return alapEro + Kepzettsegek.Sum(k => k.TulajdonsagBonusz.Ero != null ? k.TulajdonsagBonusz.Ero.Ertek : 0); }
            set { alapEro = value; }
        }
        public Tulajdonsag Gyorsasag
        {
            get { return alapGyorsasag + Kepzettsegek.Sum(k => k.TulajdonsagBonusz.Gyorsasag != null ? k.TulajdonsagBonusz.Gyorsasag.Ertek : 0); }
            set { alapGyorsasag = value; }
        }
        public Tulajdonsag Ugyesseg
        {
            get { return alapUgyesseg + Kepzettsegek.Sum(k => k.TulajdonsagBonusz.Ugyesseg != null ? k.TulajdonsagBonusz.Ugyesseg.Ertek : 0); }
            set { alapUgyesseg = value; }
        }
        public Tulajdonsag Allokepesseg
        {
            get { return alapAllokepesseg + Kepzettsegek.Sum(k => k.TulajdonsagBonusz.Allokepesseg != null ? k.TulajdonsagBonusz.Allokepesseg.Ertek : 0); }
            set { alapAllokepesseg = value; }
        }
        public Tulajdonsag Egeszseg
        {
            get { return alapEgeszseg + Kepzettsegek.Sum(k => k.TulajdonsagBonusz.Egeszseg != null ? k.TulajdonsagBonusz.Egeszseg.Ertek : 0); }
            set { alapEgeszseg = value; }
        }
        public Tulajdonsag Karizma
        {
            get { return alapKarizma + Kepzettsegek.Sum(k => k.TulajdonsagBonusz.Karizma != null ? k.TulajdonsagBonusz.Karizma.Ertek : 0); }
            set { alapKarizma = value; }
        }
        public Tulajdonsag Intelligencia
        {
            get { return alapIntelligencia + Kepzettsegek.Sum(k => k.TulajdonsagBonusz.Intelligencia != null ? k.TulajdonsagBonusz.Intelligencia.Ertek : 0); }
            set { alapIntelligencia = value; }
        }
        public Tulajdonsag Akaratero
        {
            get { return alapAkaratero + Kepzettsegek.Sum(k => k.TulajdonsagBonusz.Akaratero != null ? k.TulajdonsagBonusz.Akaratero.Ertek : 0); }
            set { alapAkaratero = value; }
        }
        public Tulajdonsag Asztral
        {
            get { return alapAsztral + Kepzettsegek.Sum(k => k.TulajdonsagBonusz.Asztral != null ? k.TulajdonsagBonusz.Asztral.Ertek : 0); }
            set { alapAsztral = value; }
        }
        public Tulajdonsag Erzekeles
        {
            get { return alapErzekeles + Kepzettsegek.Sum(k => k.TulajdonsagBonusz.Erzekeles != null ? k.TulajdonsagBonusz.Erzekeles.Ertek : 0); }
            set { alapErzekeles = value; }
        }

        public KarakterTamadoHarcertek Harcertekek()
        {
            return new KarakterTamadoHarcertek
            {
                KarakterFegyverNelkuliHarcertek = new HarcertekBonusz
                {
                    Ke = this.Ke,
                    Te = this.Te,
                    Ve = this.Ve,
                    Ce = this.Ce,
                    Mgt = this.Mgt,
                    Sfe = this.Sfe,
                    TulutesKuszob = this.TulutesKuszob,
                    Sebzes = this.Sebzes
                },
                KarakterFegyverforgatoKar = FegyverforgatoKar.OsszesHarcertekBonusz(),
                KarakterNemFegyverforgatoKar = NemFegyverforgatoKar.OsszesHarcertekBonusz()
            };
        }

        public List<Seb> Sebzesek { get; set; }

        internal void SebzestSzenved(ElszenvedettSebzes elszenvedettSebzes)
        {
            if (elszenvedettSebzes.Siker)
            {
                Sebzesek.Add(elszenvedettSebzes.Sebzes);
            }
        }
    }
}
